iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

Django 初學入門 - 從 ROR 的角度來學習 Django系列 第 8

DAY8 - Django 第一個 Model 設定

  • 分享至 

  • xImage
  •  

Django 第一個 Model 設定

前面已經建好基本的設定,現在來建置我們的第一個 Model Employer,由於我們要做的是簡易的線上開店平台,所以一定會有老闆的角色,因此先把老闆的欄位設定好:

老闆 model 欄位規劃

  1. first_name: 老闆的姓,用字串顯示
  2. last_name: 老闆的名,用字串顯示
  3. age: 老闆的年紀,用字串顯示
Employer type Foreign Key
first_name String
last_name String
age Integer

老闆所有頁面相關路徑

一開始先決定之後老闆的頁面會有哪些

<!-- 老闆列表頁 -->
http://127.0.0.1:8000/online/employer/

<!-- 新增老闆 C -->
http://127.0.0.1:8000/online/employer/create/

<!-- 老闆細節資訊頁 R -->
http://127.0.0.1:8000/online/employer/5

<!-- 更新老闆  U -->
http://127.0.0.1:8000/online/employer/5/update/

<!-- 刪除老闆 D -->
http://127.0.0.1:8000/online/employer/5/delete/

Employer Model

首先我們到 models.pyEmployer 給建立完成

# online/models.py

from django.db import models
from django.urls import reverse
# Create your models here.

class Employer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        ordering = ['last_name', 'first_name']
    
    def get_absolute_url(self):
        return reverse('employer-detail', args=[str(self.id)])
    
    def __str__(self):
        return f'{self.first_name}-{self.last_name}'

詳細介紹一下這段在幹嘛:

  1. 首先匯入自己要的會用到的fc,也就是 reverse,這個可以讓我們把 url name 轉成連結 (如果忘記 url name 是什麼記得去看昨天的文章喔)
  2. 開始設定欄位,依照事前規劃,設定好 first_namelast_nameage
  3. class Meta 的意思是,會讓之後 Employer 物件印出來的時候,讓物件依照你的規則做排列
  4. get_absolute_url 的用意是,實際把 urls.py 那邊設計的連結,直接用一個方法包起來,這樣在使用的時候比較方便,之後寫 template 的時候,會再說明
  5. def str(self): 這個很重要,當你把物件印出來,會依照這個方法的規則顯示出來,像是我們這邊設定,就會印出 first_name - last_name

PS. 如果覺得這些設定和方法很難懂的話,別擔心,我們後面會直接印出來給大家看,看這些方法到底在幹嘛


之前是寫 ROR 的看到這邊應該會不太習慣,因為 Django 是直接把資料表欄位一起寫在 models.py 檔案中,而不是 migration 檔案之中


fc 介紹

class Meta

這裡的 Meta 方法,它可以用來控制模型的行為和屬性,像是 Model 的排列順序和權限設定之類的事情,所以上面的意思就是,我先依照 last_name 排列,接著在按照 first_name 排列


ROR 中的 Order 物件排列就是可以加在這邊


get_absolute_url

假設今天我有一個 Employer 物件,我可以直接這樣寫 Employer.get_absolute_url,最後我們可以直接得到 url name='employer-detail' 的連結

後面還要加上一段 self.id,是因為 detail 就是老闆 detail 頁面,連結會像這樣子 http://127.0.0.1:8000/online/employer/5,這個連結裡面的 5 就是 self.id

Ps. 這樣寫還是很模糊,等等使用到會再提一次

def str(self)

這個方法是最重要的東西,前面兩個方法都可以不寫,但是這個不行,這個 __str__ 就是今天當你印出一個 Employer 物件時,會自動顯示的格式,像我今天這樣寫,印出一個 Employer 就會是顯示老闆的 first_name - last_name

Ps. 這個一樣等等看範例會比較清楚

具現化表單

還記得我們前面具現化過一次表單嗎?不過這一次跟前面比起來,還要再多一個指令:

  1. models 改變狀況
$ python3 manage.py makemigrations

------
Migrations for 'online':
  online/migrations/0001_initial.py
    - Create model Employer
  1. 具現化表單
$ python3 manage.py migrate 

------
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
  Applying online.0001_initial... OK

第一個指令是確認 Model 的改變情況,第二個指令是實際具現化表單,這時候應該會有人有疑問,為啥會多了一個指令,其實就是 Django 為了保險起見你已經確認你想要具現化你的表單了

不執行 makemigrations 直接執行 migrate 會怎麼樣

你可以實際這樣試試,先在 models.py 裡面新增一個 model:

# online/modes.py

class good(models.Model):
    title = models.CharField(max_length=100)
    def __str__(self):
        return self.title    

然後直接執行 migrate:

$ python3 manage.py migrate  

------
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
  No migrations to apply.
  Your models in app(s): 'online' have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

會發現系統叫你先執行 migration,再來執行 migrate!!!

Ps. 測試完後,記得要把這一段 class good 刪掉喔!!!

migration 檔案

剛剛比較細心的人,應該有注意到我們具現化表單時候的文字:

$ python3 manage.py migrate 

------
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
  Applying online.0001_initial... OK

有沒有注意到最後一句 - Applying online.0001_initial... OK,這一句出現後,此時你再打開你的專案,資料夾結構應該會變成這樣:

https://ithelp.ithome.com.tw/upload/images/20230919/20162365Sg65SEwTIX.png

多了一個 migration 檔案!接著我們點進 migration 資料夾裡面的 0001_initial.py 檔案:

# store/online/migrations/0001_initial.py

# Generated by Django 4.2.4 on 2023-09-04 05:07

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Employer',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('first_name', models.CharField(max_length=100)),
                ('last_name', models.CharField(max_length=100)),
                ('age', models.PositiveIntegerField()),
            ],
            options={
                'ordering': ['last_name', 'first_name'],
            },
        ),
    ]

會發現這個檔案中,就是寫著我們剛剛新增 Employer Model 的資訊,也就是說,以後 migration 資料夾裡面,會有著我們資料庫變動的所有歷程!


寫過 ROR 的朋友們,應該非常熟悉,這個就跟 ROR 的 migration 有點像


總結

今天學到哪些東西呢?

  1. 如何新增 Model
  2. Model 常用方法介紹
  3. python3 manage.py makemigrations 指令介紹
  4. migration 介紹

最後附上 Github: https://github.com/eagle0526/Django-store


上一篇
DAY7 - Django CSS 和 CDN 設定
下一篇
DAY9 - Employer 老闆列表頁面
系列文
Django 初學入門 - 從 ROR 的角度來學習 Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言